<?php require_once('init.php'); ?><!DOCTYPE html>
<html>
<head>
<title>Silesia Racing Drag Race</title>
<!--[if IE]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css" />

</head>
<body>
    <div id="wrapper">
        <div id="headerwrap">
        <div id="header">
           <p align="right"> Silesia Racing Drag Race</p>
        </div>
        </div>
		<div id="topwrap">
        <div id="top_components">
           <h2>League</h2>
        </div>
        </div>
        <div id="leftcolumnwrap">
        <div id="leftcolumn">
            <?php include_once ('menu_left.php');?>
        </div>
        </div>
        <div id="contentwrap">
        <div id="content">
		<div>   
		<p></p>

		    <?php
    /**
     * Stała oznaczająca że teraz pobieramy górny środek
     */
    define('UPORDOWN_UP', true);
    /**
     * Stała oznaczająca że teraz pobieramy dolny środek
     */
    define('UPORDOWN_DOWN', false);
    /**
     * Rekord uzywany do przekazania lewego i prawego końca tabelki która jest podtabelką głównej tabelki
     */
    class Bounds
    {
    /**
      * Początek
      * @var int
      */
    public $beginning;
    /**
      * Koniec
      * @var int
      */
    public $ending;
    }
    /**
     * Ta klasa zawiera algorytm ukladajacy liste graczy i zwracajacy gotowe ułożenie graczy do bitew tak by na siebie nie wpadali.
     */
    class TeamsPositionAlgorithm
    {
    /**
      * Przechowuje liczbe par drużyn do ułożenia
      * @var int
      */
    protected $howMuchPlayers;
    /**
      * Informacja czy teraz górny czy dolny środek
      * @var bool
      */
    protected $upOrDown;
    /**
      * Ilość poziomów w układanym tournamencie (rund)
      * @var int
      */
    protected $levels;
    /**
      * Wynik zwrocony przez generator ciągu
      * @var array
      */
    public $generatorResult;
    /**
      * Koncowy wynik - pary druzyn ulozone w odpowiedniej kolejnosci gotowe do przelozenia na bitwy
      * @var array
      */
    public $result;
    /**
      * Konstruktor, przelicza wszystko, pozniej nalezy jedynie uzyc metody getPairsOfPlayers(). chuj
      * @param int $levels ilość poziomów w turnieju
      */
    public function __construct($levels)
    {
    /* Ponieważ dla 16 graczy będzie 8 bitw, musimy odjąć jedną potęgę */
    $this->levels = $levels;
    /* Obliczamy ilość drużyn dla ktorych trzeba cos policzyc (2x mniej niz ilosc bitw) */
    $this->howMuchPlayers = pow(2, $this->levels);
    /* Przelicz wszystko */
    $this->generatePositions();
    }
    /**
      * Metoda zwraca tablicę podanych drużyn poukładaną specjalnym algorytmem, aby gracze na siebie nie wpadali.
      * Tablica musi być wcześniej posortowana wedle rankingów malejąco.
      * @param unknown_type $teams
      * @return array <Team>
      */
    public function getProperlyPlacedTeams($teams)
    {
    $result = null;
    /* Dla każdego wyniku z generatora */
    foreach ($this->generatorResult as $firstPlayer)
    {
    if ($firstPlayer)
    {
    if ($teams[($firstPlayer - 1)])
    {
    $result[] = $teams[($firstPlayer - 1)];
    } else
    {
    $teamWalkowerValue = _team_walkower;
    $result[] = $teamWalkowerValue;
    }
    }
    }
    return $result;
    }
    /**
      * Metoda znajduje środek (górny lub dolny w zależności od tego co mówi globalny przełącznik)
      * @param int $beginning indeks poczatku przetwarzanej czesci tabelki
      * @param int $ending indeks konca przetwarzanej czesci tabelki
      */
    private function findCenter($beginning, $ending)
    {
    $calculatedCenter = (int) (($ending - $beginning) / 2);
    $calculatedCenter = $beginning + $calculatedCenter;
    if ($this->upOrDown == UPORDOWN_DOWN)
    {
    $calculatedCenter++;
    }
    return $calculatedCenter;
    }
    /**
      * Metoda oblicza krawedzie kolejnego poziomu
      * @param unknown_type $whichPart
      * @param unknown_type $allParts
      */
    private function countBounds($whichPart, $allParts)
    {
    $result = new Bounds();
    $lengthOfPart = $this->howMuchPlayers / $allParts;
    $result->beginning = ($whichPart - 1) * $lengthOfPart + 1;
    $result->ending = ($whichPart) * $lengthOfPart;
    return $result;
    }
    /**
      * Metoda przestawia zmienną raz parzyste raz nieparzyste
      */
    private function swapUpOrDown()
    {
    if ($this->upOrDown == UPORDOWN_UP)
    $this->upOrDown = UPORDOWN_DOWN;
    else
    $this->upOrDown = UPORDOWN_UP;
    }
    /**
      * Metoda generuje pozycje dla jednego poziomu
      */
    private function generatePositions()
    {
    $this->upOrDown = UPORDOWN_DOWN;
    $this->generatorResult = null;
    $this->generatorResult[] = null;
    $this->generatorResult[] = 1;
    $this->generatorResult[] = $this->howMuchPlayers;
    if ($this->levels > 1)
    {
    $this->generatorResult[] = $this->findCenter(1, $this->howMuchPlayers);
    $this->swapUpOrDown();
    $this->generatorResult[] = $this->findCenter(1, $this->howMuchPlayers);
    $this->swapUpOrDown();
    }
    if ($this->levels > 2)
    {
    for ($secondaryCounter = 1; $secondaryCounter < $this->levels - 1; $secondaryCounter++)
    {
    $auxAlgorithm = new TeamsPositionAlgorithm($secondaryCounter);
    $queueOfCalls = $auxAlgorithm->generatorResult;
    $countMax = count($queueOfCalls) - 1;
    for ($count = 1; $count <= $countMax; $count++)
    {
    $bounds = $this->countBounds($queueOfCalls[$count], $countMax, $this->howMuchPlayers);
    $this->generatorResult[] = $this->findCenter($bounds->beginning, $bounds->ending,
    $this->upOrDown);
    $this->swapUpOrDown();
    }
    for ($count = $countMax; $count > 0; $count--)
    {
    $bounds = $this->countBounds($queueOfCalls[$count], $countMax, $this->howMuchPlayers);
    $this->generatorResult[] = $this->findCenter($bounds->beginning, $bounds->ending,
    $this->upOrDown);
    $this->swapUpOrDown();
    }
    }
    }
    }
    }
    ?>
	
		</div>
        </div>
        </div>
        <div id="rightcolumnwrap">
        <div id="rightcolumn">
			<?php include_once ('right_column.php');?>
        </div>
        </div>
        <div id="footerwrap">
        <div id="footer">
            <p>ilesia Racing Drag Race by Tomasz Kargol</p>
        </div>
        </div>
    </div>
</body>
</html>
